package com.zouxw.utils.json.controller;

import com.zouxw.utils.json.utils.AppConfig;
import com.zouxw.utils.json.utils.ExceptionHandler;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.Component;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * 文件操作控制器
 * 负责处理文件的打开、保存等操作
 * 
 * @author zouxw
 * @version 1.0
 */
public class FileController {
    
    // ==================== 组件引用 ====================
    /** 父组件（用于显示对话框） */
    private final Component parentComponent;
    
    /** 文件选择器 */
    private JFileChooser fileChooser;
    
    // ==================== 构造函数 ====================
    
    /**
     * 构造函数
     * 
     * @param parentComponent 父组件
     */
    public FileController(Component parentComponent) {
        this.parentComponent = parentComponent;
        initializeFileChooser();
    }
    
    // ==================== 初始化方法 ====================
    
    /**
     * 初始化文件选择器
     */
    private void initializeFileChooser() {
        fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter(
                AppConfig.JSON_FILE_DESCRIPTION, 
                AppConfig.JSON_FILE_EXTENSION));
    }
    
    // ==================== 公共方法 ====================
    
    /**
     * 打开文件
     * 
     * @return 文件内容，如果取消则返回null
     */
    public String openFile() {
        int result = fileChooser.showOpenDialog(parentComponent);
        if (result == JFileChooser.APPROVE_OPTION) {
            try {
                String content = new String(Files.readAllBytes(Paths.get(fileChooser.getSelectedFile().getPath())));
                return content;
            } catch (IOException e) {
                ExceptionHandler.handleFileError(parentComponent, e);
                return null;
            }
        }
        return null;
    }
    
    /**
     * 保存文件
     * 
     * @param content 要保存的内容
     * @return 是否保存成功
     */
    public boolean saveFile(String content) {
        if (content == null) {
            ExceptionHandler.showWarning(parentComponent, "警告", "没有内容可保存");
            return false;
        }
        
        int result = fileChooser.showSaveDialog(parentComponent);
        if (result == JFileChooser.APPROVE_OPTION) {
            try {
                String fileName = fileChooser.getSelectedFile().getPath();
                if (!fileName.toLowerCase().endsWith("." + AppConfig.JSON_FILE_EXTENSION)) {
                    fileName += "." + AppConfig.JSON_FILE_EXTENSION;
                }
                
                Files.write(Paths.get(fileName), content.getBytes("UTF-8"));
                return true;
            } catch (IOException e) {
                ExceptionHandler.handleFileError(parentComponent, e);
                return false;
            }
        }
        return false;
    }
    
    /**
     * 另存为文件
     * 
     * @param content 要保存的内容
     * @return 是否保存成功
     */
    public boolean saveAsFile(String content) {
        if (content == null) {
            ExceptionHandler.showWarning(parentComponent, "警告", "没有内容可保存");
            return false;
        }
        
        // 重置文件选择器，确保显示另存为对话框
        fileChooser.setSelectedFile(null);
        
        int result = fileChooser.showSaveDialog(parentComponent);
        if (result == JFileChooser.APPROVE_OPTION) {
            try {
                String fileName = fileChooser.getSelectedFile().getPath();
                if (!fileName.toLowerCase().endsWith("." + AppConfig.JSON_FILE_EXTENSION)) {
                    fileName += "." + AppConfig.JSON_FILE_EXTENSION;
                }
                
                Files.write(Paths.get(fileName), content.getBytes("UTF-8"));
                return true;
            } catch (IOException e) {
                ExceptionHandler.handleFileError(parentComponent, e);
                return false;
            }
        }
        return false;
    }
    
    /**
     * 获取当前选择的文件路径
     * 
     * @return 文件路径
     */
    public String getCurrentFilePath() {
        if (fileChooser.getSelectedFile() != null) {
            return fileChooser.getSelectedFile().getPath();
        }
        return null;
    }
    
    /**
     * 获取当前选择的文件名
     * 
     * @return 文件名
     */
    public String getCurrentFileName() {
        if (fileChooser.getSelectedFile() != null) {
            return fileChooser.getSelectedFile().getName();
        }
        return null;
    }
    
    /**
     * 设置文件选择器的当前目录
     * 
     * @param directory 目录路径
     */
    public void setCurrentDirectory(String directory) {
        if (directory != null && !directory.trim().isEmpty()) {
            fileChooser.setCurrentDirectory(Paths.get(directory).toFile());
        }
    }
    
    /**
     * 设置文件选择器的当前文件
     * 
     * @param filePath 文件路径
     */
    public void setSelectedFile(String filePath) {
        if (filePath != null && !filePath.trim().isEmpty()) {
            fileChooser.setSelectedFile(Paths.get(filePath).toFile());
        }
    }
    
    /**
     * 检查文件是否存在
     * 
     * @param filePath 文件路径
     * @return 是否存在
     */
    public boolean fileExists(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return false;
        }
        return Files.exists(Paths.get(filePath));
    }
    
    /**
     * 获取文件大小
     * 
     * @param filePath 文件路径
     * @return 文件大小（字节），如果文件不存在返回-1
     */
    public long getFileSize(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return -1;
        }
        
        try {
            return Files.size(Paths.get(filePath));
        } catch (IOException e) {
            return -1;
        }
    }
    
    /**
     * 格式化文件大小
     * 
     * @param size 文件大小（字节）
     * @return 格式化后的文件大小字符串
     */
    public String formatFileSize(long size) {
        if (size < 0) {
            return "未知";
        }
        
        if (size < 1024) {
            return size + " B";
        } else if (size < 1024 * 1024) {
            return String.format("%.1f KB", size / 1024.0);
        } else if (size < 1024 * 1024 * 1024) {
            return String.format("%.1f MB", size / (1024.0 * 1024.0));
        } else {
            return String.format("%.1f GB", size / (1024.0 * 1024.0 * 1024.0));
        }
    }
    
    /**
     * 检查文件是否为JSON格式
     * 
     * @param filePath 文件路径
     * @return 是否为JSON格式
     */
    public boolean isJsonFile(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return false;
        }
        
        String fileName = Paths.get(filePath).getFileName().toString().toLowerCase();
        return fileName.endsWith("." + AppConfig.JSON_FILE_EXTENSION);
    }
    
    /**
     * 获取文件扩展名
     * 
     * @param filePath 文件路径
     * @return 扩展名（不包含点号）
     */
    public String getFileExtension(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return "";
        }
        
        String fileName = Paths.get(filePath).getFileName().toString();
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) {
            return fileName.substring(lastDotIndex + 1).toLowerCase();
        }
        return "";
    }
    
    /**
     * 获取不带扩展名的文件名
     * 
     * @param filePath 文件路径
     * @return 不带扩展名的文件名
     */
    public String getFileNameWithoutExtension(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return "";
        }
        
        String fileName = Paths.get(filePath).getFileName().toString();
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0) {
            return fileName.substring(0, lastDotIndex);
        }
        return fileName;
    }
}
